import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CalculadoraSwing extends JFrame {
    private static final int LARGURA = 300;
    private static final int ALTURA = 400;
    private JPanel jpnlTeclado;
    private JTextField jtxtTela;
    private JButton jbtnLimpar;
    private JButton jbtnIgualdade;
    private JButton jbtnAdicao;
    private JButton jbtnSubtracao;
    private JButton jbtnMultiplicacao;
    private JButton jbtnDivisao;
    private JButton jbtnPonto;
    private JButton jbtnNumUm;
    private JButton jbtnNumDois;
    private JButton jbtnNumTres;
    private JButton jbtnNumQuatro;
    private JButton jbtnNumCinco;
    private JButton jbtnNumSeis;
    private JButton jbtnNumSete;
    private JButton jbtnNumOito;
    private JButton jbtnNumNove;
    private JButton jbtnNumZero;
    private Calculadora calc;
    
    public CalculadoraSwing() {
        super("Calculadora Java");
        criarComponentes();
    }
    
    private void criarComponentes() {
        setLayout(null);
        
        jtxtTela = new JTextField();
        jtxtTela.setBounds(5, 5, LARGURA-25, 50);
        jtxtTela.setHorizontalAlignment(JTextField.RIGHT);
        jtxtTela.setFont(new Font("Arial", Font.BOLD, 25));
        jtxtTela.setEnabled(false);
        add(jtxtTela);
        
        jpnlTeclado = new JPanel();
        jpnlTeclado.setBounds(5, 60, LARGURA-25, 295);
        jpnlTeclado.setLayout(new GridLayout(5,4));
        add(jpnlTeclado);
        
        jbtnLimpar = new JButton("C");
        jpnlTeclado.add(jbtnLimpar);
        
        jpnlTeclado.add(new JLabel());
        jpnlTeclado.add(new JLabel());
        jpnlTeclado.add(new JLabel());
        
        jbtnNumSete = new JButton("7");
        jpnlTeclado.add(jbtnNumSete);
        
        jbtnNumOito = new JButton("8");
        jpnlTeclado.add(jbtnNumOito);
        
        jbtnNumNove = new JButton("9");
        jpnlTeclado.add(jbtnNumNove);
        
        jbtnAdicao = new JButton("+");
        jpnlTeclado.add(jbtnAdicao);
        
        jbtnNumQuatro = new JButton("4");
        jpnlTeclado.add(jbtnNumQuatro);
        
        jbtnNumCinco = new JButton("5");
        jpnlTeclado.add(jbtnNumCinco);
        
        jbtnNumSeis = new JButton("6");
        jpnlTeclado.add(jbtnNumSeis);
        
        jbtnSubtracao = new JButton("-");
        jpnlTeclado.add(jbtnSubtracao);
        
        jbtnNumUm = new JButton("1");
        jpnlTeclado.add(jbtnNumUm);
        
        jbtnNumDois = new JButton("2");
        jpnlTeclado.add(jbtnNumDois);
        
        jbtnNumTres = new JButton("3");
        jpnlTeclado.add(jbtnNumTres);
        
        jbtnMultiplicacao = new JButton("*");
        jpnlTeclado.add(jbtnMultiplicacao);
        
        jbtnNumZero = new JButton("0");
        jpnlTeclado.add(jbtnNumZero);
        
        jbtnPonto = new JButton(".");
        jpnlTeclado.add(jbtnPonto);
        
        jbtnIgualdade = new JButton("=");
        jpnlTeclado.add(jbtnIgualdade);
        
        jbtnDivisao = new JButton("/");
        jpnlTeclado.add(jbtnDivisao);
        
        vincularEventosBotao();
        inicializarValores();
    }
    
    private void vincularEventosBotao() {
        TratamentoEvento te = new TratamentoEvento();
        jbtnAdicao.addActionListener(te);
        jbtnSubtracao.addActionListener(te);
        jbtnMultiplicacao.addActionListener(te);
        jbtnDivisao.addActionListener(te);
        jbtnIgualdade.addActionListener(te);
        jbtnLimpar.addActionListener(te);
        jbtnPonto.addActionListener(te);
        jbtnNumUm.addActionListener(te);
        jbtnNumDois.addActionListener(te);
        jbtnNumTres.addActionListener(te);
        jbtnNumQuatro.addActionListener(te);
        jbtnNumCinco.addActionListener(te);
        jbtnNumSeis.addActionListener(te);
        jbtnNumSete.addActionListener(te);
        jbtnNumOito.addActionListener(te);
        jbtnNumNove.addActionListener(te);
        jbtnNumZero.addActionListener(te);
    }
    
    private void inicializarValores() {
        jtxtTela.setText("0");
        calc = new Calculadora();
    }
    
    private void limpar() {
        jtxtTela.setText("0");
        calc.setOperacao("");
        calc.setTotalParcial(0);
        calc.setTotal(0);
    }
    
    public static void main(String[] args) {
        CalculadoraSwing calc = new CalculadoraSwing();
        calc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        calc.setSize(LARGURA,ALTURA);
        calc.setVisible(true);
    }
    
    private class TratamentoEvento implements ActionListener {
        public void actionPerformed(ActionEvent ev) {
            if(ev.getSource() == jbtnLimpar) {
                limpar();
            } else if(ev.getSource() == jbtnAdicao) {
                if(!jtxtTela.getText().isEmpty()) {
                    double valor = Double.parseDouble(jtxtTela.getText());
                    calc.calcular(valor, Calculadora.ADICAO);
                    jtxtTela.setText("");
                }
            } else if(ev.getSource() == jbtnSubtracao) {
                if(!jtxtTela.getText().isEmpty()) {
                    double valor = Double.parseDouble(jtxtTela.getText());
                    calc.calcular(valor, Calculadora.SUBTRACAO);
                    jtxtTela.setText("");
                }
            } else if(ev.getSource() == jbtnMultiplicacao) {
                if(!jtxtTela.getText().isEmpty()) {
                    double valor = Double.parseDouble(jtxtTela.getText());
                    calc.calcular(valor, Calculadora.MULTIPLICACAO);
                    jtxtTela.setText("");
                }
            } else if(ev.getSource() == jbtnDivisao) {
                if(!jtxtTela.getText().isEmpty()) {
                    double valor = Double.parseDouble(jtxtTela.getText());
                    calc.calcular(valor, Calculadora.DIVISAO);
                    jtxtTela.setText("");
                }
            } else if(ev.getSource() == jbtnIgualdade) {
                if(!jtxtTela.getText().isEmpty()) {
                    double valor = Double.parseDouble(jtxtTela.getText());
                    calc.calcular(valor, Calculadora.IGUALDADE);
                    jtxtTela.setText(calc.obterTotalFormatado());
                    calc.setOperacao("");
                }
            } else if(ev.getSource() == jbtnPonto) {
                if(jtxtTela.getText().isEmpty()) {
                    jtxtTela.setText("0.");
                } else {
                    if(jtxtTela.getText().indexOf(".") == -1) {
                        jtxtTela.setText(jtxtTela.getText() + ".");
                    }
                }
            } else if(ev.getSource() == jbtnNumZero) {
                if(jtxtTela.getText().isEmpty()) {
                    jtxtTela.setText("0");
                } else {
                    if(jtxtTela.getText().length() == 1 && jtxtTela.getText().startsWith("0")) {
                        System.out.println("Tamanho: " + jtxtTela.getText().length() + " Valor: " + jtxtTela.getText());
                    } else {
                        jtxtTela.setText(jtxtTela.getText()+"0");
                    }
                }
            } else {
                JButton jbtnTemp = (JButton)ev.getSource();
                if(jtxtTela.getText().startsWith("0") && jtxtTela.getText().length() == 1) {
                    jtxtTela.setText(jbtnTemp.getText());
                } else {
                    jtxtTela.setText(jtxtTela.getText()+jbtnTemp.getText());
                }
            }
        }
    }
}
